package com.donleo.ssm.controller;

import com.donleo.ssm.dto.UserDto;
import com.donleo.ssm.model.UserModel;
import com.donleo.ssm.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;

/**
 * @author liangd
 * date 2020-11-17 16:41
 * code
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    /*
        Spring4.3中引进了｛@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping｝
        来帮助简化常用的HTTP方法的映射 并更好地表达被注解方法的语义

        1、@GetMapping： 处理get请求，传统的RequestMapping来编写
            应该是@RequestMapping(value = “/get/{id}”, method = RequestMethod.GET)
        新方法可以简写为：@GetMapping("/get/{id}")
        2、@PostMapping： 处理post请求，传统的RequestMapping来编写应该是@RequestMapping(value = “/get/{id}”,method = RequestMethod.POST)
        新方法可以简写为：

        3、@PostMapping("/get/{id}")
        4、@PutMapping： 和PostMapping作用等同，都是用来向服务器提交信息。如果是添加信息，
           倾向于用@PostMapping，如果是更新信息，倾向于用@PutMapping。两者差别不是很明显。

        5、@DeleteMapping 删除URL映射，具体没有再实践中用过，不知道好在什么地方

     */
    /**
     * 查询所有
     *
     * @return
     */
    @RequestMapping(value = "/findAll", method = RequestMethod.GET)
    public List<UserModel> findAll() {
        return userService.findAll();
    }

    /**
     * 查询单个
     * RequestParam  ?id= 参数传值
     * PathVariable  /id= 路径传值
     * @requestParam 和@param的区别
     * 1、@requestParam 是Spring中的注解 一般用于Controller层
     * 2、@param 是mybatis中的注解 一般用于dao层
     * 两者的作用都是使参数的变量名保持一致
     *
     * @return
     */
    @GetMapping("/findById")
    public UserModel findById(@RequestParam Integer id) {
        return userService.findById(id);
    }

    @GetMapping("findByPathId/{id}")
    public UserModel findByPathId(@PathVariable Integer id) {
        return userService.findById(id);
    }

    /**
     * 模糊查询
     * RequestBody: 将传入参数自动封装成UserModel类型
     * RequestBody不能处理 multipart/form-data 数据
     * @param userModel
     * @return
     */
    @PostMapping("/findAllBySome")
    public List<UserModel> findAllBySome(@RequestBody UserModel userModel) {
        return userService.findAllBySome(userModel);
    }

    /**
     * 添加
     *
     * @param userModel
     * @return
     */
    @PostMapping("/add")
    public Integer add(@RequestBody UserModel userModel) {
        UserModel user =null;
        try {
            userModel.setId(null);
            user = userService.add(userModel);
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
        //将添加的Id返回给前端
        return user.getId();
    }

    /**
     * 单个删除
     *
     * @param id
     * @return
     */
    @DeleteMapping("/delete")
    public Integer delete(@RequestParam Integer id) {
        return userService.delete(id);
    }

    /**
     * 批量删除
     *
     * @param ids
     * @return
     */
    @PostMapping("/deletes")
    public Integer deletes(@RequestParam Integer[] ids) {
        List<Integer> idsList = Arrays.asList(ids);
        return userService.deletes(idsList);
    }

    /**
     * 修改
     *
     * @param userModel
     * @return
     */
    @PutMapping("/update")
    public Integer update(@RequestBody UserModel userModel) {
        //Assert断言---判断method中参数是否是正常值
        Assert.notNull(userModel.getId(),"Id is not null!");
        return userService.update(userModel);
    }

    /**************************测试注解参数使用*******************************/
    /**
     * 测试mvc接收list参数
     * @param userDto
     */
    @PostMapping("/testGetList")
    public void testGetList(@RequestBody UserDto userDto){
        System.out.println(Arrays.asList(userDto));
    }

    /**
     * @RequestParam 参数说明
     * 1、value         请求参数名称
     * 2、required      参数是否必须
     * 3、defaultValue  默认值
     */
    @GetMapping("/testParameter")
    public void testParameter(@RequestParam(value = "name",required = false,defaultValue = "liangd") String username){
        System.out.println(username);
    }

    /**
     * @RequestHeader 获取请求头参数
     * @param use_agent
     */
    @GetMapping("/testRequestHeader")
    public void testRequestHeader(@RequestHeader("User-Agent") String use_agent){

    }

    /**
     * @CookieValue 获取jsessionId
     * @param jsessionId
     */
    @GetMapping("/testRequestCookie")
    public void testRequestCookie(@CookieValue("JSESSIONID") String jsessionId){

    }

}
